﻿using System;

namespace Lambda
{
    class Program
    {
        static void Main(string[] args)
        {
            string globalString = "I am global string.";

            /**
             * Func<string, string>
             * 第一个string代表参数param
             * 第二个string代表返回结果string
             */
             /**
              * 表达式可以访问代码块外部变量，比如访问变量globalString的值
              * 但是这会带来一个问题，比如多线程调用同一个lambda表达式时，不同线程对应的外部变量值是什么，在程序运行时无法准确知道。
              */
            Func<string, string> LambdaFunction = param =>
             {
                 return globalString + param;
             };

            string result = LambdaFunction("I am param string.");
            Console.WriteLine(result);

            Func<int, double, double> GetTotalMoney = (number, price) =>
            {
                return number * price;
            };
            double totalMoney = GetTotalMoney(3, 2.3);
            /**
             * 保留两位小数 String.Format("{0:N2}")
             * 保留三位小数 String.Format("{0:N3}")
             */
            Console.WriteLine("Total money: {0}", String.Format("{0:N2}", totalMoney));

            // 如果lambda表达式没有多行代码，那么就可以省略代码块和return
            Func<int, int> Square = x => x * x;
            Console.WriteLine("x square: {0}", Square(3));

        }
    }
}
